<?php

class Request {
	
	const REDIRECT_BACK = -1;
	const REDIRECT_404 = 404;

	private static $_data;

	public static function redirect($url) {
		switch ($url) {
			case self::REDIRECT_404:
				$header = "HTTP/1.1 404 Not Found";
				break;
			
			case self::REDIRECT_BACK:
				$header = "location: ". $_SERVER['HTTP_REFERER'];
				break;

			default:
				$header = "location: $url";
				break;
		}

		header($header);
		
		switch ($url) {
			case self::REDIRECT_404:
				throw new Exception('404 Not Found', 404);
				break;
		}
		
		exit();
	}
	
	/**
	 * Генерирует строку запроса.
	 * @param string $page_link Параметр link модели Pages
	 * @param array|string $data Строка запроса в виде строки <code>("var=data&foo=bar")</code> или в виде массива <code>(array('var' => 'data', 'foo' => 'bar'))</code>
	 * @param bull $absolute_url Если true метод вернет полный адрес, false - относительный. По умолчанию - false;
	 * @return string			
	 */
	public static function url($page_link = "", $data = array(), $absolute_url = false) {
		$rel_url = App::getInstance()->config()->data($absolute_url ? 'site_url' : 'relative_url');
		
		$return = strpos($page_link, $rel_url) === 0 ? "" : $rel_url;
		$return .= (preg_match('|\.html|', $page_link) ? $page_link : ($page_link . ".html"));
		
		$_data = "";
		if (is_string($data)) $data = self::parseUrlString($data);
		if (count($data)) {
			foreach ($data as $k => $v) {
				$_data .= "/$k/$v";
			}
		}
		$return .= $_data;

		return $return;
	}
	
	/**
	 * Генерирует строку запроса, но основной страницей будет текущая страница сайта.
	 * @see Request::url();
	 */
	public static function cUrl($data = array(), $absolute_url = false){
		$link = App::getInstance()->page->link;
		return self::url($link, $data, $absolute_url);
	}
	
	/**
	 * Генерирует строку запроса, но основной страницей будет страница, переданая в параметр linked_page блока в поле #0.
	 * Если блока не существует, или страница не указана будет возвращена текущая страница.
	 * @see Request::url();
	 * @see Request::сUrl();
	 */
	public static function bUrl($data = array(), $absolute_url = false){
		$link = isset(App::getInstance()->fields[0]) && isset(App::getInstance()->fields[0][0]) ? App::getInstance()->fields[0][0]->LinkedPage->lnk : false;
		return $link ? self::url($link, $data, $absolute_url) : self::cUrl($data, $absolute_url);
	}

	public static function parseUrlString($str) {
		$str = preg_replace('|^\?|', "", $str);
		$parts = preg_split('|&|', $str);

		$return = array();
		if (count($parts)) {
			foreach ($parts as $part) {
				$part = preg_split('|=|', $part);
				if (!isset($part[1])) $part[1] = null;
				$return[$part[0]] = $part[1];
			}
		}

		return $return;
	}

	public static function getLink() {
		if (self::$_link === null) {
			self::parseURI();
		}

		return self::$_link;
	}

	private static function parseURI() {
		if (is_array(self::$_data)) return;

		
		$serverUri = $_SERVER['REQUEST_URI'];

		if ($serverUri == "/") {
			self::$_link = "";
		} else {
			$_t = preg_split("|\.html|", $serverUri, 2);
			self::$_link = urldecode(preg_replace("|^\/|", "", $_t[0]));

			if (isset($_t[1])) {
				$_t[1] = trim($_t[1], '\/ ');
				$__t = preg_split("|\/|", $_t[1]);
				foreach ($__t as $k => $v) {
					if ($k % 2 == 0) $_data[$v] = isset($__t[$k + 1]) ? $__t[$k + 1] : false;
				}

				self::$_data = $_data;
			}
		}
	}

}